package com.zy.explore.demo.infrastructure.utils;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.util.ObjectUtils;

import java.util.HashSet;
import java.util.Set;

/**
* 数据Util
* @author 刘小龙 xiaolong.liu@pingcl.com
* @Date       ：Created in 2021/03/10
* @Modified By：
* @Version: v1.0.0$
*/
public class DataUtils {



	/**
	 * 将给定源bean的属性值复制到给定目标bean中，忽略给定的“ignoreProperties”。
	 * 注意:只要属性匹配，源类和目标类不必匹配，甚至不必相互派生。源bean公开但目标bean没有公开的任何bean属性都将被忽略。
	 * 这只是一个方便的方法。对于更复杂的传输需求，可以考虑使用完整的BeanWrapper。
	 *
	 * @date 2021/03/10
	 * @param src
	 * @param target void
	 */
	public static void copyPropertiesIgnoreNull(Object src, Object target) {
		BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
	}

	/**
	 * 是否忽略copy对象中的null，true为忽略，false为不忽略
	 *
	 * @param source
	 * @param target
	 * @param copyNull
	 */
	public static void copyPropertiesIgnoreNull(Object source, Object target, boolean copyNull) {
		if (copyNull) {
			BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
		} else {
			BeanUtils.copyProperties(source, target);
		}

	}
	
	/**
	 * 判断拷贝资源中哪些属性为空
	 *
	 * @param source
	 * @return
	 */
	public static String[] getNullPropertyNames(Object source) {
		final BeanWrapper sourse = new BeanWrapperImpl(source);
		java.beans.PropertyDescriptor[] pds = sourse.getPropertyDescriptors();

		Set<String> emptyNames = new HashSet<String>();
		for (java.beans.PropertyDescriptor pd : pds) {
			Object sourseValue = sourse.getPropertyValue(pd.getName());
			if (ObjectUtils.isEmpty(sourseValue)) {
				emptyNames.add(pd.getName());
			}
		}
		String[] result = new String[emptyNames.size()];
		return emptyNames.toArray(result);
	}
	/**
	 * 判断拷贝资源中哪些属性不为空
	 *
	 * @param source
	 * @return
	 */
	public static Set<String> getNotNullPropertyNames(Object source) {
		final BeanWrapper sourse = new BeanWrapperImpl(source);
		java.beans.PropertyDescriptor[] pds = sourse.getPropertyDescriptors();
		
		Set<String> notEmptyNames = new HashSet<String>();
		for (java.beans.PropertyDescriptor pd : pds) {
			Object sourseValue = sourse.getPropertyValue(pd.getName());
			if (!ObjectUtils.isEmpty(sourseValue)) {
				notEmptyNames.add(pd.getName());
			}
		}
		return notEmptyNames;
	}
	
	
}